/**
 * @author Roger Wu
 */
(function ($) {
    $.extend($.fn, {
        jBlindUp: function (options) {
            var op = $.extend({
                duration: 500, easing: "swing", call: function () {
                }
            }, options);
            return this.each(function () {
                var $this = $(this);
                $(this).animate({height: 0}, {
                    step: function () {
                    },
                    duration: op.duration,
                    easing: op.easing,
                    complete: function () {
                        $this.css({display: "none"});
                        op.call();
                    }
                });
            });
        },
        jBlindDown: function (options) {
            var op = $.extend({
                to: 0, duration: 500, easing: "swing", call: function () {
                }
            }, options);
            return this.each(function () {
                var $this = $(this);
                var fixedPanelHeight = (op.to > 0) ? op.to : $.effect.getDimensions($this[0]).height;
                $this.animate({height: fixedPanelHeight}, {
                    step: function () {
                    },
                    duration: op.duration,
                    easing: op.easing,
                    complete: function () {
                        $this.css({display: ""});
                        op.call();
                    }
                });
            });
        },
        jSlideUp: function (options) {
            var op = $.extend({
                to: 0, duration: 500, easing: "swing", call: function () {
                }
            }, options);
            return this.each(function () {
                var $this = $(this);
                $this.wrapInner("<div></div>");
                var fixedHeight = (op.to > 0) ? op.to : $.effect.getDimensions($(">div", $this)[0]).height;
                $this.css({overflow: "visible", position: "relative"});
                $(">div", $this).css({position: "relative"}).animate({top: -fixedHeight}, {
                    easing: op.easing,
                    duration: op.duration,
                    complete: function () {
                        $this.html($(this).html());
                    }
                });

            });
        },
        jSlideDown: function (options) {
            var op = $.extend({
                to: 0, duration: 500, easing: "swing", call: function () {
                }
            }, options);
            return this.each(function () {
                var $this = $(this);
                var fixedHeight = (op.to > 0) ? op.to : $.effect.getDimensions($this[0]).height;
                $this.wrapInner("<div style=\"top:-" + fixedHeight + "px;\"></div>");
                $this.css({overflow: "visible", position: "relative", height: "0px"})
                    .animate({height: fixedHeight}, {
                        duration: op.duration,
                        easing: op.easing,
                        complete: function () {
                            $this.css({display: "", overflow: ""});
                            op.call();
                        }
                    });
                $(">div", $this).css({position: "relative"}).animate({top: 0}, {
                    easing: op.easing,
                    duration: op.duration,
                    complete: function () {
                        $this.html($(this).html());
                    }
                });
            });
        }
    });
    $.effect = {
        getDimensions: function (element, displayElement) {
            var dimensions = new $.effect.Rectangle;
            var displayOrig = $(element).css('display');
            var visibilityOrig = $(element).css('visibility');
            var isZero = $(element).height() == 0 ? true : false;
            if ($(element).is(":hidden")) {
                $(element).css({visibility: 'hidden', display: 'block'});
                if (isZero) $(element).css("height", "");
                if ($.browser.opera)
                    refElement.focus();
            }
            dimensions.height = $(element).outerHeight();
            dimensions.width = $(element).outerWidth();
            if (displayOrig == 'none') {
                $(element).css({visibility: visibilityOrig, display: 'none'});
                if (isZero) if (isZero) $(element).css("height", "0px");
            }
            return dimensions;
        }
    }
    $.effect.Rectangle = function () {
        this.width = 0;
        this.height = 0;
        this.unit = "px";
    }
})(jQuery);
